package com.oha.laporrayelchurro.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import com.oha.laporrayelchurro.dao.PronosticoDao;
import com.oha.laporrayelchurro.model.Pronostico;

public class PronosticoService extends XlsService{
	
	private static Logger log4j = Logger.getLogger(PronosticoService.class);
	
	/**
	 * 
	 * @return
	 */
	public List<Pronostico> getPronostico(int idUsuario, String xlsFile){
		List<Pronostico> pList = new ArrayList<Pronostico>();
		try {
			Sheet sheet = getSheet(xlsFile);
			pList.addAll(get16(pList.size()+1, idUsuario, sheet));
			pList.addAll(get8(pList.size()+1, idUsuario, sheet));
			pList.addAll(get4(pList.size()+1, idUsuario, sheet));
			pList.addAll(get3(pList.size()+1, idUsuario, sheet));
			pList.addAll(get2(pList.size()+1, idUsuario, sheet));
			pList.addAll(get1(pList.size()+1, idUsuario, sheet));
		} catch (InvalidFormatException | IOException e) {
			log4j.error("getPronostico.InvalidFormatException | IOException.", e);
		}
		return pList;
	}
	
	/**
	 * 
	 * @param nPartido
	 * @return
	 */
	private List<Pronostico> get16(int nPartido, int idUsuario, Sheet sheet){
		int rowIni=12;
		int rowEnd=75;
		int colIni=4;
		int colEnd=9;
		int grupo=0;
		List<Pronostico> pronosticoList = new ArrayList<Pronostico>();
		for(int nrow =rowIni; nrow<rowEnd; nrow ++){
			Row row = sheet.getRow(nrow);
			Pronostico pronostico = new Pronostico();
			for(int col=colIni; col<colEnd; col++){
				Cell cell = row.getCell(col);
				int cellType = row.getCell(col).getCellType();
				if(col==4){

				}else if(col==5 && (cellType==1 || cellType==2)){//String

				}else if(col==6){
					pronostico.setGoles1(((Double)cell.getNumericCellValue()).intValue());
				}else if(col==7){
					pronostico.setGoles2(((Double)cell.getNumericCellValue()).intValue());
				}else if(col==8){

				}
			}
			grupo++;
			pronostico.setIdUsuario(idUsuario);
			pronostico.setIdPartido(nPartido++);
			pronosticoList.add(pronostico);
			if(grupo>=6){
				grupo=0;
				nrow+=2;
			}
		}
		return pronosticoList;
	}
	
	/**
	 * 
	 * @param nPartido
	 * @return
	 */
	private List<Pronostico> get8(int nPartido, int idUsuario, Sheet sheet){
		int step = 4;
		List<Pronostico> partidoLst = new ArrayList<Pronostico>();
		for(int nrow=13; nrow<42; nrow+=step){
			Pronostico p = new Pronostico();
			Cell cell = sheet.getRow(nrow).getCell(23);
			p.setPais1(cell.getStringCellValue());
			cell = sheet.getRow(nrow+1).getCell(23);
			p.setPais2(cell.getStringCellValue());
			
			cell = sheet.getRow(nrow).getCell(24);
			p.setGoles1(((Double)cell.getNumericCellValue()).intValue());
			cell = sheet.getRow(nrow+1).getCell(24);
			p.setGoles2(((Double)cell.getNumericCellValue()).intValue());
			
			p.setIdUsuario(idUsuario);
			p.setIdPartido(nPartido++);

			partidoLst.add(p);
		}
		return partidoLst;
	}
	
	/**
	 * 
	 * @param nPartido
	 * @return
	 */
	private List<Pronostico> get4(int nPartido, int idUsuario, Sheet sheet){
		int step = 4;
		List<Pronostico> pLst = new ArrayList<Pronostico>();
		for(int nrow=46; nrow<59; nrow+=step){
			Pronostico p = new Pronostico();
			Cell cell = sheet.getRow(nrow).getCell(23);
			p.setPais1(cell.getStringCellValue());
			cell = sheet.getRow(nrow+1).getCell(23);
			p.setPais2(cell.getStringCellValue());
			
			cell = sheet.getRow(nrow).getCell(24);
			p.setGoles1(((Double)cell.getNumericCellValue()).intValue());
			cell = sheet.getRow(nrow+1).getCell(24);
			p.setGoles2(((Double)cell.getNumericCellValue()).intValue());
			
			p.setIdUsuario(idUsuario);
			p.setIdPartido(nPartido++);
			pLst.add(p);
		}
		return pLst;
	}
	
	/**
	 * 
	 * @param nPartido
	 * @return
	 */
	private List<Pronostico> get3(int nPartido, int idUsuario, Sheet sheet){
		int step = 4;
		List<Pronostico> pLst = new ArrayList<Pronostico>();
		for(int nrow=63; nrow<68; nrow+=step){
			Pronostico p = new Pronostico();
			Cell cell = sheet.getRow(nrow).getCell(23);
			p.setPais1(cell.getStringCellValue());
			cell = sheet.getRow(nrow+1).getCell(23);
			p.setPais2(cell.getStringCellValue());
			
			cell = sheet.getRow(nrow).getCell(24);
			p.setGoles1(((Double)cell.getNumericCellValue()).intValue());
			cell = sheet.getRow(nrow+1).getCell(24);
			p.setGoles2(((Double)cell.getNumericCellValue()).intValue());
			
			p.setIdUsuario(idUsuario);
			p.setIdPartido(nPartido++);
			pLst.add(p);
		}
		return pLst;
	}
	
	/**
	 * 
	 * @param nPartido
	 * @return
	 */
	private List<Pronostico> get2(int nPartido, int idUsuario, Sheet sheet){
		int step = 4;
		List<Pronostico> pLst = new ArrayList<Pronostico>();
		for(int nrow=72; nrow<74; nrow+=step){
			Pronostico p = new Pronostico();
			Cell cell = sheet.getRow(nrow).getCell(23);
			p.setPais1(cell.getStringCellValue());
			cell = sheet.getRow(nrow+1).getCell(23);
			p.setPais2(cell.getStringCellValue());
			
			cell = sheet.getRow(nrow).getCell(24);
			p.setGoles1(((Double)cell.getNumericCellValue()).intValue());
			cell = sheet.getRow(nrow+1).getCell(24);
			p.setGoles2(((Double)cell.getNumericCellValue()).intValue());
			
			p.setIdUsuario(idUsuario);
			p.setIdPartido(nPartido++);
			pLst.add(p);
		}
		return pLst;
	}
	
	/**
	 * 
	 * @param nPartido
	 * @return
	 */
	private List<Pronostico> get1(int nPartido, int idUsuario, Sheet sheet){
		List<Pronostico> pList = new ArrayList<Pronostico>();
		Pronostico p = new Pronostico();
		Cell cell = sheet.getRow(77).getCell(23);
		p.setPais1(cell.getStringCellValue());
		cell = sheet.getRow(78).getCell(23);
		p.setPais2(cell.getStringCellValue());
		
		cell = sheet.getRow(77).getCell(24);
		p.setGoles1(((Double)cell.getNumericCellValue()).intValue());
		cell = sheet.getRow(78).getCell(24);
		p.setGoles2(((Double)cell.getNumericCellValue()).intValue());
		
		p.setIdUsuario(idUsuario);
		p.setIdPartido(nPartido++);
		pList.add(p);
		return pList;
	}
	
	/**
	 * 
	 * @param idUsuario
	 */
	public void eliminarPronostico(int idUsuario){
		PronosticoDao proDao = new PronosticoDao();
		proDao.delete(idUsuario);
	}
	
}
